package org.zn.note.java8;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 * 对象之间存在1：N的关系时，但一个对象被修改了，通知其他N个关联对象。观察者模式属于行为模式。
 * “主题”对象变化了，通知“观察者”对象。
 * <p>
 * lombok，可以直接写观察者
 */
public class Ch08_Pattern_Observer {

    public static void main(String[] args) {
        Feed f = new Feed();
        f.registerObserver(new NYTimes());
        f.registerObserver(new Guardian());
        f.registerObserver(new LeMonde());
        f.notifyObservers("The queen said her favourite book is Java 8 in Action!");
    }

    // 主题
    interface Subject {
        void registerObserver(Observer o);

        void notifyObservers(String tweet);
    }

    // 观察者
    interface Observer {
        void notify(String tweet);
    }

    static class Feed implements Subject {
        private final List<Observer> observers = new ArrayList<>();

        public void registerObserver(Observer o) {
            this.observers.add(o);
        }

        public void notifyObservers(String tweet) {
            observers.forEach(o -> o.notify(tweet));
        }
    }

    static class NYTimes implements Observer {
        public void notify(String tweet) {
            if (tweet != null && tweet.contains("money")) {
                System.out.println("Breaking news in NY! " + tweet);
            }
        }
    }

    static class Guardian implements Observer {
        public void notify(String tweet) {
            if (tweet != null && tweet.contains("queen")) {
                System.out.println("Yet another news in London... " + tweet);
            }
        }
    }

    static class LeMonde implements Observer {
        public void notify(String tweet) {
            if (tweet != null && tweet.contains("wine")) {
                System.out.println("Today cheese, wine and news! " + tweet);
            }
        }
    }
}
